package com.itany.corejava.code13_jdbc;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 * @author Miss Chen
 * @version 1.0
 * @date 2024年08月08日10:02
 */
public class Test09_多表查询 {
    public static void main(String[] args) throws DataAccessException {
       // List<Emp> emps= selectAll();
       //  System.out.println(emps);

        Dept dept=selectDeptById(1);
        System.out.println(dept);
    }


    /**
     * 多对一查询
     * 查询所有员工以及员工所属的部门信息
     * @return
     */
    public static List<Emp> selectAll(){
        Connection conn=null;
        PreparedStatement ps=null;
        ResultSet rs=null;
        List<Emp> emps=new ArrayList<>();
        try {
            conn=JDBCUtil.getConnection();
            String sql=new StringBuffer()
                    .append(" select e.id ,e.name,e.salary,d.id,d.name,d.remark ")
                    .append(" from t_emp e ")
                    .append(" left join t_dept d ")
                    .append(" on e.dept_id=d.id ")
                    .toString();
            ps=conn.prepareStatement(sql);
            rs=ps.executeQuery();
            while(rs.next()){
                //此时映射涉及到2个对象
                Emp emp=new Emp();
                emp.setId(rs.getInt("e.id"));
                emp.setName(rs.getString("e.name"));
                emp.setSalary(rs.getDouble("e.salary"));

                //准备Dept对象，进行映射
                Dept dept=new Dept();
                dept.setId(rs.getInt("d.id"));
                dept.setName(rs.getString("d.name"));
                dept.setRemark(rs.getString("d.remark"));

                //在员工对象中，有一个属性，该属性是部门对象类型
                //将映射好的对象作为员工对象的属性存在
                emp.setDept(dept);

                //每生成一个emp对象，将其添加到对应的集合中去
                emps.add(emp);

            }

        } catch (DataAccessException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
        }
        return emps;
    }

    /**
     * 一对多查询
     * 根据部门编号查询部门以及该部门下的所有员工信息
     * @param id
     * @return
     */
    public static Dept selectDeptById(Integer id) throws DataAccessException {
        Connection conn=null;
        PreparedStatement ps=null;
        ResultSet rs=null;
        Dept dept=null;
        try {
            conn=JDBCUtil.getConnection();
            String sql=new StringBuffer()
                    .append(" select d.id,d.name,d.remark,e.id,e.name,e.salary ")
                    .append(" from t_dept d ")
                    .append(" left join t_emp e ")
                    .append(" on d.id=e.dept_id ")
                    .append(" where d.id=? ")
                    .toString();
            ps=conn.prepareStatement(sql);
            ps.setInt(1,id);
            rs=ps.executeQuery();
            while(rs.next()){
                System.out.println("===============");
                if(dept==null){
                    //一对多映射
                    //当第一次进来的时候，映射部门对象
                    //后面再次进来，不再对部门进行映射
                    // 当dept为null值的说明尚未映射过
                    // 如果对dept进行映射，则dept的值不为null
                    dept=new Dept();
                    dept.setId(rs.getInt("d.id"));
                    dept.setName(rs.getString("d.name"));
                    dept.setRemark(rs.getString("d.remark"));
                }

                //对于员工信息，每遍历一次，映射一个员工对象
                // 每次进来都需要对员工进行映射
                Emp emp=new Emp();
                emp.setId(rs.getInt("e.id"));
                emp.setName(rs.getString("e.name"));
                emp.setSalary(rs.getDouble("e.salary"));
                dept.addEmp(emp);
            }
            return dept;
        } catch (DataAccessException e) {
            e.printStackTrace();
            throw e;
        } catch (SQLException e) {
            e.printStackTrace();
            throw new DataAccessException("数据库访问异常");
        } finally {
            JDBCUtil.close(conn,ps,rs);
        }
    }
}
